<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="LK9cT" id="LK9cT"><span data-lake-id="ub6e11560" id="ub6e11560">典型回答</span></h1>
  <p data-lake-id="ub98f4ccc" id="ub98f4ccc"><span data-lake-id="u5f109301" id="u5f109301">创建的对象数应该是1个或者2个。</span></p>
  <p data-lake-id="u03f42e7c" id="u03f42e7c"><span data-lake-id="u348fbf65" id="u348fbf65">​</span><br></p>
  <p data-lake-id="ua8c24805" id="ua8c24805"><span data-lake-id="u22031009" id="u22031009">首先要清楚什么是对象？</span></p>
  <p data-lake-id="ub2bc9b01" id="ub2bc9b01"><br></p>
  <p data-lake-id="u1aba8f9b" id="u1aba8f9b"><span data-lake-id="u01c371e6" id="u01c371e6">Java是一种面向对象的语言，而Java对象在JVM中的存储也是有一定的结构的，在HotSpot虚拟机中，存储的形式就是oop-klass model，即Java对象模型。我们在Java代码中，使用new创建一个对象的时候，JVM会创建一个instanceOopDesc对象，这个对象中包含了两部分信息，对象头以及元数据。对象头中有一些运行时数据，其中就包括和多线程相关的锁的信息。元数据其实维护的是指针，指向的是对象所属的类的instanceKlass。</span></p>
  <p data-lake-id="u1d35f8d6" id="u1d35f8d6"><span data-lake-id="u24ad3be7" id="u24ad3be7">​</span><br></p>
  <p data-lake-id="uaef2eb52" id="uaef2eb52"><span data-lake-id="u780ab05c" id="u780ab05c">这才叫对象。其他的，一概都不叫对象。</span></p>
  <p data-lake-id="u3984c8b7" id="u3984c8b7"><span data-lake-id="u6fffb7ed" id="u6fffb7ed">​</span><br></p>
  <p data-lake-id="ufa85caa6" id="ufa85caa6"><span data-lake-id="ub408defb" id="ub408defb">那么不管怎么样，一次new的过程，都会在堆上创建一个对象，那么就是起码有一个对象了。至于另外一个对象，到底有没有要看具体情况了。</span></p>
  <p data-lake-id="u56d38ec5" id="u56d38ec5"><span data-lake-id="uf6229f66" id="uf6229f66">​</span><br></p>
  <p data-lake-id="u9cc7c0fa" id="u9cc7c0fa"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1704006181996-80ad196a-2546-4756-9bf6-92d44c5d51d0.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_24%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u0be547e7" id="u0be547e7"><span data-lake-id="u02a3c742" id="u02a3c742">​</span><br></p>
  <p data-lake-id="ucf6a9ecf" id="ucf6a9ecf"><span data-lake-id="uef8539e7" id="uef8539e7">另外这一个对象就是常量池中的字符串常量，这个字符串其实是类编译阶段就进到Class常量池的，然后在运行期，字符串常量在第一次被调用(准确的说是ldc指令)的时候，进行解析并在字符串池中创建对应的String实例的。</span></p>
  <p data-lake-id="u22722878" id="u22722878"><span data-lake-id="uedc0b174" id="uedc0b174">​</span><br></p>
  <p data-lake-id="u173efa3b" id="u173efa3b"><span data-lake-id="uab89037f" id="uab89037f">​</span><br></p>
  <p data-lake-id="u33b04d8f" id="u33b04d8f"><span data-lake-id="u08f94fad" id="u08f94fad">​</span><br></p>
  <p data-lake-id="u5527e60b" id="u5527e60b"><span data-lake-id="u5338ad94" id="u5338ad94">在运行时常量池中，也并不是会立刻被解析成对象，而是会先以JVM_CONSTANT_UnresolveString_info的形式驻留在常量池。在后面，该引用第一次被LDC指令执行到的时候，就尝试在堆上创建字符串对象，并将对象的引用驻留在字符串常量池中。</span></p>
  <p data-lake-id="u430618c5" id="u430618c5"><span data-lake-id="uc18923ad" id="uc18923ad">​</span><br></p>
  <p data-lake-id="u946413cf" id="u946413cf"><span data-lake-id="u0416bb10" id="u0416bb10">通过看上面的过程，你也能发现，这个过程的触发条件是我们没办法决定的，问题的题干中也没提到。有可能执行这段代码的时候是第一次LDC指令执行，也许在前面就执行过了。</span></p>
  <p data-lake-id="u5a6cfb75" id="u5a6cfb75"><strong><span data-lake-id="uba695a85" id="uba695a85">​</span></strong><br></p>
  <p data-lake-id="u79b93936" id="u79b93936"><strong><span data-lake-id="u5aca6902" id="u5aca6902">所以，如果是第一次执行，那么就是会同时创建两个对象。一个字符串常量引用指向的对象，一个我们new出来的对象。</span></strong></p>
  <p data-lake-id="u2e563be9" id="u2e563be9"><strong><span data-lake-id="u7c07fda2" id="u7c07fda2">​</span></strong><br></p>
  <p data-lake-id="u62730464" id="u62730464"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1704006329527-80677410-5c40-456b-87bf-8a8f9d9816c2.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_31%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u8795a007" id="u8795a007"><strong><span data-lake-id="ue80329d1" id="ue80329d1">​</span></strong><br></p>
  <p data-lake-id="u216dab4b" id="u216dab4b"><strong><span data-lake-id="u0f571c9c" id="u0f571c9c">如果不是第一次执行，那么就只会创建我们自己new出来的对象。</span></strong></p>
  <p data-lake-id="ueb5fbcb0" id="ueb5fbcb0"><strong><span data-lake-id="u4a431578" id="u4a431578">​</span></strong><br></p>
  <p data-lake-id="u16d6b58b" id="u16d6b58b"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1704006345858-83577855-2fe4-41cc-896e-45f4e8bd6d8b.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_31%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="uef9db144" id="uef9db144"><span data-lake-id="uabd98a72" id="uabd98a72">​</span><br></p>
  <p data-lake-id="uc5415f1b" id="uc5415f1b"><span data-lake-id="u4193bda5" id="u4193bda5">至于有人说什么在字符串池内还有在栈上还有一个引用对象，你听听这说法，引用就是引用。别往对象上面扯。</span></p>
  <p data-lake-id="u502715e1" id="u502715e1"><br></p>
  <h1 data-lake-id="o7lAl" id="o7lAl"><span data-lake-id="u748417ff" id="u748417ff">扩展知识</span></h1>
  <p data-lake-id="u16ceb5d6" id="u16ceb5d6"><br></p>
  <h2 data-lake-id="zbkC8" id="zbkC8"><span data-lake-id="u78c08df6" id="u78c08df6">字面量和运行时常量池</span></h2>
  <p data-lake-id="u6561095c" id="u6561095c"><br></p>
  <p data-lake-id="uf4149a1d" id="uf4149a1d"><span data-lake-id="ua5b4fb94" id="ua5b4fb94">JVM为了提高性能和减少内存开销，在实例化字符串常量的时候进行了一些优化。为了减少在JVM中创建的字符串的数量，字符串类维护了一个字符串常量池。</span></p>
  <p data-lake-id="u322dcad5" id="u322dcad5"><br></p>
  <p data-lake-id="u47d15a5f" id="u47d15a5f"><span data-lake-id="uc34c767a" id="uc34c767a">在JVM运行时区域的方法区中，有一块区域是运行时常量池，主要用来存储</span><strong><span data-lake-id="u20d5e244" id="u20d5e244">编译期</span></strong><span data-lake-id="u10d24ad1" id="u10d24ad1">生成的各种</span><strong><span data-lake-id="u8c6e78a4" id="u8c6e78a4">字面量</span></strong><span data-lake-id="u0db39594" id="u0db39594">和</span><strong><span data-lake-id="uc159f0ca" id="uc159f0ca">符号引用</span></strong><span data-lake-id="uff493121" id="uff493121">。</span></p>
  <p data-lake-id="u6b42512b" id="u6b42512b"><br></p>
  <p data-lake-id="u920b0ea3" id="u920b0ea3"><span data-lake-id="uec2b63b8" id="uec2b63b8">了解Class文件结构或者做过Java代码的</span><span data-lake-id="u3f484d9d" id="u3f484d9d">反编译</span><span data-lake-id="u45674146" id="u45674146">的朋友可能都知道，在java代码被</span><code data-lake-id="u16617306" id="u16617306"><span data-lake-id="u8aa47697" id="u8aa47697">javac</span></code><span data-lake-id="u319823c4" id="u319823c4">编译之后，文件结构中是包含一部分</span><code data-lake-id="ua9dad11f" id="ua9dad11f"><span data-lake-id="u83de2694" id="u83de2694">Constant pool</span></code><span data-lake-id="u94d89964" id="u94d89964">的。比如以下代码：</span></p>
  <p data-lake-id="ucb208b8d" id="ucb208b8d"><br></p>
  <pre lang="java"><code>
public static void main(String[] args) {
    String s = "Hollis";
}
</code></pre>
  <p data-lake-id="u0e1fb917" id="u0e1fb917"><br></p>
  <p data-lake-id="ue99f151d" id="ue99f151d"><span data-lake-id="u2236ff1b" id="u2236ff1b">经过编译后，常量池内容如下：</span></p>
  <p data-lake-id="u14d2f6a9" id="u14d2f6a9"><br></p>
  <pre lang="java"><code>
 Constant pool:
   #1 = Methodref          #4.#20         // java/lang/Object."&lt;init&gt;":()V
   #2 = String             #21            // Hollis
   #3 = Class              #22            // StringDemo
   #4 = Class              #23            // java/lang/Object
   ...
   #16 = Utf8               s
   ..
   #21 = Utf8               Hollis
   #22 = Utf8               StringDemo
   #23 = Utf8               java/lang/Object
</code></pre>
  <p data-lake-id="u3916d65a" id="u3916d65a"><br></p>
  <p data-lake-id="uad9cec20" id="uad9cec20"><span data-lake-id="uc8c61c19" id="uc8c61c19">上面的Class文件中的常量池中，比较重要的几个内容：</span></p>
  <p data-lake-id="uf9b64b7a" id="uf9b64b7a"><br></p>
  <pre lang="java"><code>
   #16 = Utf8               s
   #21 = Utf8               Hollis
   #22 = Utf8               StringDemo
</code></pre>
  <p data-lake-id="ua087ee30" id="ua087ee30"><br></p>
  <p data-lake-id="u0caa3e48" id="u0caa3e48"><span data-lake-id="ubd8eb370" id="ubd8eb370">上面几个常量中，</span><code data-lake-id="uf9c4774c" id="uf9c4774c"><span data-lake-id="u059b1855" id="u059b1855">s</span></code><span data-lake-id="u1fc10dfc" id="u1fc10dfc">就是前面提到的</span><strong><span data-lake-id="uad46d7e7" id="uad46d7e7">符号引用</span></strong><span data-lake-id="ue1ede890" id="ue1ede890">，而</span><code data-lake-id="uaf474941" id="uaf474941"><span data-lake-id="ue47a9de5" id="ue47a9de5">Hollis</span></code><span data-lake-id="u248613fa" id="u248613fa">就是前面提到的</span><strong><span data-lake-id="ub25d2622" id="ub25d2622">字面量</span></strong><span data-lake-id="u5ec23928" id="u5ec23928">。而Class文件中的常量池部分的内容，会在运行期被运行时常量池加载进去。关于字面量，详情参考</span><a href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5" target="_blank" data-lake-id="ube2e6856" id="ube2e6856"><span data-lake-id="uecf3664d" id="uecf3664d">Java SE Specifications</span></a></p>
  <h2 data-lake-id="k0MHP" id="k0MHP"><span data-lake-id="u24b99fd1" id="u24b99fd1">intern</span></h2>
  <p data-lake-id="u42e21a63" id="u42e21a63"><br></p>
  <p data-lake-id="u84aa6d62" id="u84aa6d62"><strong><span data-lake-id="u81880242" id="u81880242">编译期</span></strong><span data-lake-id="ub617cea5" id="ub617cea5">生成的各种</span><strong><span data-lake-id="u01562f1d" id="u01562f1d">字面量</span></strong><span data-lake-id="u1e825492" id="u1e825492">和</span><strong><span data-lake-id="u01c1b03e" id="u01c1b03e">符号引用</span></strong><span data-lake-id="u9a0b8881" id="u9a0b8881">是运行时常量池中比较重要的一部分来源，但是并不是全部。那么还有一种情况，可以在运行期向运行时常量池中增加常量。那就是</span><code data-lake-id="uceddae46" id="uceddae46"><span data-lake-id="u8d86d649" id="u8d86d649">String</span></code><span data-lake-id="ucba0484b" id="ucba0484b">的</span><code data-lake-id="ua178c083" id="ua178c083"><span data-lake-id="u25176c85" id="u25176c85">intern</span></code><span data-lake-id="u3e020ab2" id="u3e020ab2">方法。</span></p>
  <p data-lake-id="uedd7d71f" id="uedd7d71f"><br></p>
  <p data-lake-id="u1156c73b" id="u1156c73b"><span data-lake-id="u61f1e9b9" id="u61f1e9b9">当一个</span><code data-lake-id="u3fafdec7" id="u3fafdec7"><span data-lake-id="u9c9c4c7f" id="u9c9c4c7f">String</span></code><span data-lake-id="u2dc60cf4" id="u2dc60cf4">实例调用</span><code data-lake-id="ue6fc37dd" id="ue6fc37dd"><span data-lake-id="ueca9ede8" id="ueca9ede8">intern()</span></code><span data-lake-id="u2c144e6b" id="u2c144e6b">方法时，Java查找常量池中是否有相同Unicode的字符串常量，如果有，则返回其的引用，如果没有，则在常量池中增加一个Unicode等于str的字符串并返回它的引用；</span></p>
  <p data-lake-id="u7a9737a9" id="u7a9737a9"><br></p>
  <p data-lake-id="u125e39d0" id="u125e39d0"><strong><span data-lake-id="ub774a71e" id="ub774a71e">intern()有两个作用，第一个是将字符串字面量放入常量池（如果池没有的话），第二个是返回这个常量的引用。</span></strong></p>
  <p data-lake-id="u796667b3" id="u796667b3"><br></p>
  <h3 data-lake-id="nYZnm" id="nYZnm"><span data-lake-id="uba75c918" id="uba75c918">intern的正确用法</span></h3>
  <p data-lake-id="u7a1ff080" id="u7a1ff080"><br></p>
  <p data-lake-id="u9e09a5c1" id="u9e09a5c1"><span data-lake-id="ua29b526b" id="ua29b526b">不知道，你有没有发现，在</span><code data-lake-id="u1ed7cafc" id="u1ed7cafc"><span data-lake-id="ud0bf524c" id="ud0bf524c">String s3 = new String("Hollis").intern();</span></code><span data-lake-id="ue1d9b626" id="ue1d9b626">中，其实</span><code data-lake-id="ub6f2848b" id="ub6f2848b"><span data-lake-id="uf71578c1" id="uf71578c1">intern</span></code><span data-lake-id="u07d014ef" id="u07d014ef">是多余的？</span></p>
  <p data-lake-id="u0a02b7e3" id="u0a02b7e3"><br></p>
  <p data-lake-id="ua6e0cf80" id="ua6e0cf80"><span data-lake-id="u2ea4abe1" id="u2ea4abe1">因为就算不用</span><code data-lake-id="uef8478e5" id="uef8478e5"><span data-lake-id="u506c5480" id="u506c5480">intern</span></code><span data-lake-id="u780e1072" id="u780e1072">，Hollis作为一个字面量也会被加载到Class文件的常量池，进而加入到运行时常量池中，为啥还要多此一举呢？到底什么场景下才需要使用</span><code data-lake-id="u0b508303" id="u0b508303"><span data-lake-id="u9c612bd0" id="u9c612bd0">intern</span></code><span data-lake-id="ubaeb544c" id="ubaeb544c">呢？</span></p>
  <p data-lake-id="u7110b04e" id="u7110b04e"><br></p>
  <p data-lake-id="uc9860626" id="uc9860626"><span data-lake-id="u376ebf93" id="u376ebf93">在解释这个之前，我们先来看下以下代码：</span></p>
  <p data-lake-id="u5481fec2" id="u5481fec2"><br></p>
  <pre lang="java"><code>
    String s1 = "Hollis";
    String s2 = "Chuang";
    String s3 = s1 + s2;
    String s4 = "Hollis" + "Chuang";
</code></pre>
  <p data-lake-id="u601627ba" id="u601627ba"><br></p>
  <p data-lake-id="u68c99ae4" id="u68c99ae4"><span data-lake-id="u52b1a5cf" id="u52b1a5cf">在经过反编译后，得到代码如下：</span></p>
  <p data-lake-id="uf2ba818f" id="uf2ba818f"><br></p>
  <pre lang="java"><code>
    String s1 = "Hollis";
    String s2 = "Chuang";
    String s3 = (new StringBuilder()).append(s1).append(s2).toString();
    String s4 = "HollisChuang";
</code></pre>
  <p data-lake-id="u6a894425" id="u6a894425"><br></p>
  <p data-lake-id="u279e911e" id="u279e911e"><span data-lake-id="ucc9a6e94" id="ucc9a6e94">可以发现，同样是字符串拼接，s3和s4在经过编译器编译后的实现方式并不一样。s3被转化成</span><code data-lake-id="u6352d397" id="u6352d397"><span data-lake-id="ue7ae2ca2" id="ue7ae2ca2">StringBuilder</span></code><span data-lake-id="u05f15838" id="u05f15838">及</span><code data-lake-id="u143c60ea" id="u143c60ea"><span data-lake-id="uf370758a" id="uf370758a">append</span></code><span data-lake-id="u7812daa3" id="u7812daa3">，而s4被直接拼接成新的字符串。</span></p>
  <p data-lake-id="u18c082eb" id="u18c082eb"><br></p>
  <p data-lake-id="u0aa75ad3" id="u0aa75ad3"><span data-lake-id="u86db642e" id="u86db642e">如果你感兴趣，你还能发现，</span><code data-lake-id="ucc6490d1" id="ucc6490d1"><span data-lake-id="u2bb055f6" id="u2bb055f6">String s3 = s1 + s2;</span></code><span data-lake-id="ue4b2d6fa" id="ue4b2d6fa"> 经过编译之后，常量池中是有两个字符串常量的分别是 </span><code data-lake-id="u604d2203" id="u604d2203"><span data-lake-id="u9b18cf4a" id="u9b18cf4a">Hollis</span></code><span data-lake-id="ue2caaf5a" id="ue2caaf5a">、</span><code data-lake-id="ua3988c54" id="ua3988c54"><span data-lake-id="u4ef82349" id="u4ef82349">Chuang</span></code><span data-lake-id="u7b6154b1" id="u7b6154b1">（其实</span><code data-lake-id="uedf11f24" id="uedf11f24"><span data-lake-id="u9e9f649f" id="u9e9f649f">Hollis</span></code><span data-lake-id="u81e7b785" id="u81e7b785">和</span><code data-lake-id="u14323939" id="u14323939"><span data-lake-id="u325ad58f" id="u325ad58f">Chuang</span></code><span data-lake-id="u397e46d9" id="u397e46d9">是</span><code data-lake-id="ua167dbda" id="ua167dbda"><span data-lake-id="u07925f25" id="u07925f25">String s1 = "Hollis";</span></code><span data-lake-id="ud50bbe0c" id="ud50bbe0c">和</span><code data-lake-id="u25f5a590" id="u25f5a590"><span data-lake-id="ua47efee3" id="ua47efee3">String s2 = "Chuang";</span></code><span data-lake-id="ufc067d62" id="ufc067d62">定义出来的），拼接结果</span><code data-lake-id="ucb3c15f5" id="ucb3c15f5"><span data-lake-id="u34c40008" id="u34c40008">HollisChuang</span></code><span data-lake-id="u0072326d" id="u0072326d">并不在常量池中。</span></p>
  <p data-lake-id="u695b988f" id="u695b988f"><br></p>
  <p data-lake-id="u57923358" id="u57923358"><span data-lake-id="ub59abb91" id="ub59abb91">究其原因，是因为常量池要保存的是</span><strong><span data-lake-id="ud9f7ceed" id="ud9f7ceed">已确定</span></strong><span data-lake-id="ubc1615c3" id="ubc1615c3">的字面量值。也就是说，对于字符串的拼接，纯字面量和字面量的拼接，会把拼接结果作为常量保存到字符串池。</span></p>
  <p data-lake-id="ua1bc6e1e" id="ua1bc6e1e"><br></p>
  <p data-lake-id="u4fd97504" id="u4fd97504"><span data-lake-id="u433f2d35" id="u433f2d35">如果在字符串拼接中，有一个参数是非字面量，而是一个变量的话，整个拼接操作会被编译成</span><code data-lake-id="u0a8fdc24" id="u0a8fdc24"><span data-lake-id="u9493c1fd" id="u9493c1fd">StringBuilder.append</span></code><span data-lake-id="u3b69ccb2" id="u3b69ccb2">，这种情况编译器是无法知道其确定值的。只有在运行期才能确定。</span></p>
  <p data-lake-id="u0c05e74e" id="u0c05e74e"><br></p>
  <p data-lake-id="u57e09891" id="u57e09891"><span data-lake-id="u2b16283a" id="u2b16283a">那么，有了这个特性了，</span><code data-lake-id="u3c85a953" id="u3c85a953"><span data-lake-id="u90c80af6" id="u90c80af6">intern</span></code><span data-lake-id="ub35d1d32" id="ub35d1d32">就有用武之地了。那就是很多时候，我们在程序中得到的字符串是只有在运行期才能确定的，在编译期是无法确定的，那么也就没办法在编译期被加入到常量池中。</span></p>
  <p data-lake-id="u27567d6e" id="u27567d6e"><br></p>
  <p data-lake-id="u67988086" id="u67988086"><span data-lake-id="ue9921ab6" id="ue9921ab6">这时候，对于那种可能经常使用的字符串，使用</span><code data-lake-id="u88e7e715" id="u88e7e715"><span data-lake-id="u5eddd796" id="u5eddd796">intern</span></code><span data-lake-id="u8ef4ca5c" id="u8ef4ca5c">进行定义，每次JVM运行到这段代码的时候，就会直接把常量池中该字面值的引用返回，这样就可以减少大量字符串对象的创建了。</span></p>
  <p data-lake-id="ue3104179" id="ue3104179"><br></p>
  <p data-lake-id="ud6cdbae5" id="ud6cdbae5"><span data-lake-id="u8baaaace" id="u8baaaace">如一</span><a href="https://tech.meituan.com/in_depth_understanding_string_intern.html" target="_blank" data-lake-id="u37b2c567" id="u37b2c567"><span data-lake-id="u91ec88ca" id="u91ec88ca">深入解析String#intern</span></a><span data-lake-id="ufcce1dbf" id="ufcce1dbf">文中举的一个例子：</span></p>
  <p data-lake-id="uf3adf005" id="uf3adf005"><br></p>
  <pre lang="java"><code>
static final int MAX = 1000 * 10000;
static final String[] arr = new String[MAX];

public static void main(String[] args) throws Exception {
    Integer[] DB_DATA = new Integer[10];
    Random random = new Random(10 * 10000);
    for (int i = 0; i &lt; DB_DATA.length; i++) {
        DB_DATA[i] = random.nextInt();
    }
    long t = System.currentTimeMillis();
    for (int i = 0; i &lt; MAX; i++) {
         arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length])).intern();
    }

    System.out.println((System.currentTimeMillis() - t) + "ms");
    System.gc();
}
</code></pre>
  <p data-lake-id="ub96675d2" id="ub96675d2"><br></p>
  <p data-lake-id="u205347c3" id="u205347c3"><span data-lake-id="u45a76a4b" id="u45a76a4b">在以上代码中，我们明确的知道，会有很多重复的相同的字符串产生，但是这些字符串的值都是只有在运行期才能确定的。所以，只能我们通过</span><code data-lake-id="u1c81d22d" id="u1c81d22d"><span data-lake-id="u329ca13f" id="u329ca13f">intern</span></code><span data-lake-id="u4942d3d6" id="u4942d3d6">显示的将其加入常量池，这样可以减少很多字符串的重复创建。</span></p>
  <p data-lake-id="u6a508314" id="u6a508314"><br></p>
  <h3 data-lake-id="DiDzq" id="DiDzq"><span data-lake-id="u32584547" id="u32584547">intern原理</span></h3>
  <p data-lake-id="u07e0c370" id="u07e0c370"><br></p>
 </body>
</html>